package binarySearchTree.binarySearch;

/**
 * 使用递归的二分查找法
 * mxf
 * 2018年5月31日08:40:50
 */
public class BinarySearch2 {
    private static int search(Comparable[] arr, int l, int r, Comparable target) {
        if(l > r) {
            return -1;
        }
        int mid = l + (r - l) / 2;
        if(arr[mid].compareTo(target) == 0) {
            return mid;
        }
        if(arr[mid].compareTo(target) > 0) {
            return search(arr, l, mid - 1, target);
        } else {
            return search(arr, mid + 1, r, target);
        }
    }

    // 二分查找法,在有序数组arr中,查找target
    // 如果找到target,返回相应的索引index
    // 如果没有找到target,返回-1
    public static int search(Comparable[] arr, Comparable target) {
        int n = arr.length;
        return search(arr, 0, n - 1, target);
    }

    // 测试递归的二分查找算法
    public static void main(String[] args) {

        int N = 1000000;
        Integer[] arr = new Integer[N];
        for(int i = 0 ; i < N ; i ++)
            arr[i] = new Integer(i);

        // 对于我们的待查找数组[0...N)
        // 对[0...N)区间的数值使用二分查找，最终结果应该就是数字本身
        // 对[N...2*N)区间的数值使用二分查找，因为这些数字不在arr中，结果为-1
        for(int i = 0 ; i < 2*N ; i ++) {
            int v = BinarySearch2.search(arr, new Integer(i));
            if (i < N)
                assert v == i;
            else
                assert v == -1;
        }

        return;
    }
}
